package jmine.tec.hydra.script;

import java.util.ArrayList;
import java.util.List;

import jmine.tec.script.ScriptLogger;
import jmine.tec.script.impl.ScriptLoggerImpl;
import jmine.tec.services.io.ServiceBean;
import jmine.tec.services.io.ServicesPageBean;

/**
 * Bean contendo os resultados da decodificação de um script.
 * 
 * @author lundberg
 */
public class DecodeResult {

    private List<ServicesPageBean> services = new ArrayList<ServicesPageBean>();

    private List<Object> messages = new ArrayList<Object>();

    private ScriptLogger scriptLogger = new ScriptLoggerImpl();
    
    private boolean send = false;

    /**
     * Adiciona um serviço
     * 
     * @param service service
     */
    public void addService(ServiceBean service) {
        if (this.services.isEmpty()) {
            this.addNewServicesPage();
        }
        this.services.get(this.services.size() - 1).addService(service);
    }

    /**
     * Adiciona uma mensagem a ser enviada de acordo com a especificação, codificada com o source dado.
     * 
     * @param source source
     */
    public void addMessage(Object source) {
        this.messages.add(source);
    }

    /**
     * Verifica se o script definiu serviços a serem executados
     * 
     * @return boolean
     */
    public boolean hasServices() {
        for (ServicesPageBean page : this.services) {
            if (!page.getServices().isEmpty()) {
                return true;
            }
        }
        return false;
    }

    /**
     * Verifica se o script definiu mensagens a serem enviadas
     * 
     * @return boolean
     */
    public boolean hasMessages() {
        return !this.messages.isEmpty();
    }

    /**
     * Registra a falha da execução
     * 
     * @param msg msg
     */
    public void fail(String msg) {
        this.scriptLogger.fail(msg);
    }

    /**
     * Registra a falha da execução
     * 
     * @param msg msg
     * @param t cause
     */
    public void fail(String msg, Throwable t) {
        this.scriptLogger.fail(msg, t);
    }

    /**
     * Adiciona uma nova página de serviços
     */
    public void addNewServicesPage() {
        this.services.add(new ServicesPageBean());
    }

    /**
     * Remove a última página de serviços e adiciona uma vazia no lugar
     */
    public void discardServicePage() {
        if (!this.services.isEmpty()) {
            this.services.remove(this.services.size() - 1);
            this.addNewServicesPage();
        }
    }

    /**
     * Adiciona um log
     * 
     * @param log log
     */
    public void addLog(String log) {
        this.scriptLogger.info(log);
    }

    /**
     * Retorna a lista de objetos source de mensagens a serem enviadas como resultado.
     * 
     * @return lista de codificações a serem feitas
     */
    public List<Object> getMessages() {
        return this.messages;
    }

    /**
     * @return the services
     */
    public List<ServicesPageBean> getServices() {
        return this.services;
    }

    /**
     * @return the logs
     */
    public List<String> getLogs() {
        return this.scriptLogger.getLogs();
    }

    /**
     * @return the success
     */
    public boolean isSuccess() {
        return this.scriptLogger.isSuccess();
    }

    /**
     * @return should send a message?
     */
    public boolean shouldSend() {
        return send;
    }

    /**
     * @param send send
     */
    public void setSend(boolean send) {
        this.send = send;
    }
}
